Iniciação à Estatística no R

Professor Fernando Bastos - MAF 105/UFV

Preliminares

O software R é um conjunto integrado de recursos para leitura e manipulação de dados, cálculos e exibição gráfica. O R é um programa baseado em linhas de comando. Isto é, o usuário cria uma linha de código através de uma sequência de palavras e números. Ao digitar a linha no console, o R interpreta e executa a ação codificada na linha. Também é possível informar para R, um conjunto de linhas de uma única vez, que conhecemos como script. Ao processar o script no console, o R irá ler a primeira linha, interpretar e executar. Só depois que o processamento da primeira linha terminar, é que a segunda linha será lida, interpretada e executada. Esta sequência segue, até que todo o script tenha sido processado.

No caso do R, a linguagem utilizada recebe o mesmo nome: linguagem R. A linguagem R possui regras próprias, que chamamos de sintaxe. Estas regras precisam ser seguidas para assegurar que o programa interprete e processe as linhas com sucesso.

Após instalar o software R e abrir o programa veremos algo semelhante a:

Apesar de ser simples utilizar o R diretamente do seu console raiz, existe um compilador que é mais atrativo. O RStudio é o melhor ambiente disponível para programação em R. Ao abrir o RStudio, você verá 4 ambientes. Observe a figura abaixo.

Esses quadrantes representam o editor, o console, o environment e o output. Eles vêm nesta ordem, e depois você pode organizá-los da forma que preferir.

Listamos abaixo as funções dos principais painéis:

  • Editor/Scripts: é onde escrevemos nossos códigos.
  • Console: é onde rodamos o código e recebemos as saídas. O R vive aqui!
  • Environment: painel com todos os objetos criados na sessão.
  • Files: mostra os arquivos no diretório de trabalho. É possível navegar entre diretórios.
  • Plots: painel onde os gráficos serão apresentados.
  • Help: janela onde a documentação das funções serão apresentadas.
  • History: painel com um histórico dos comandos rodados.

Conhecer atalhos ajuda bastante quando estamos programando no RStudio. Veja os principais:

  • CTRL+ENTER: roda a linha selecionada no script. Os atalhos mais utilizado.
  • ALT+-: (<-) sinal de atribuição. Você usará o tempo todo.
  • CTRL+SHIFT+M: (%>%) operador pipe. Guarde esse atalho, você usará bastante.
  • CTRL+1: altera cursor para o script.
  • CTRL+2: altera cursor para o console.
  • CTRL+ALT+I: cria um chunk no R Markdown.
  • ALT+SHIFT+K: janela com todos os atalhos disponíveis.

Vamos agora começar a trabalhar!

Na linguagem R, não é necessário declarar uma variável antes dela ser criada. O programa já tenta determinar a melhor classe com base na primeira vez que algo for atribuído à variável. Vamos rodar a seguinte linha:

x = 1

O sinal “=” é a representação do termo atribuição, e pode ser substituído pelo sinal “<-”. Portanto, o comando abaixo equivale ao comando anterior:

x <- 1

Os comandos acima são equivalentes e podem ser interpretados como: atribua o valor 1 à variável x. Ao criar a variável x, o R irá definir x como numérico e armazenar numa estrutura de vetor, pois o 1 é claramente um número. Vetor é a estrutura mais simples que uma variável pode assumir, e somente pode assumir um mesmo tipo de dados. No exemplo:

a <- 1

A variável a será automaticamente definida pelo R como um vetor numérico. O principal atributo de uma estrutura do tipo vetor é o comprimento. O vetor a, por exemplo, é um vetor de comprimento um, ou seja, contém apenas um elemento. Isto pode ser comprovado através do seguinte comando:

length(a)
## [1] 1

Note, que quando você quer criar um vetor com mais de um elemento, é necessário utilizar a função c(). A letra c vem de components, assim, ao utilizar a função c() você está informando ao R que construa um vetor com os componentes listados dentro da função.

O R trabalha com padrão internacional de separação decimal e separação de colunas. A separação decimal é “.” (ponto). E a separação de coluna é “,” (vírgula).

Matrizes nada mais são que combinações de vetores com o mesmo comprimento e tipo de dado. As variáveis estruturadas como matriz possuem portanto uma característica que o vetor não tem: dimensão. A dimensão é uma característica que indica quantas linhas e quantas colunas a matriz possui. Vamos criar uma matriz e armazená-la na variável m1:

m1 = matrix(c(2, 4, 3, 1, 5, 7), nrow = 2, ncol = 3, byrow = TRUE)

O comando dim() retorna a dimensão de uma matriz. Antes de rodar esse comando para a matriz recém criada m1, qual a dimensão desta matriz? Se você respondeu 2 x 3, acertou! Agora rode o comando abaixo e tire a prova:

dim(m1)
## [1] 2 3

Dataframe é uma condição especial de combinação lado a lado de vetores. Ao contrário das matrizes, o dataframe não exige que os vetores tenham os mesmos tipos de dados. Assim, por exemplo, a primeira coluna do dataframe pode ser numérica, e a segunda coluna pode ser de texto e a terceira coluna com data. O R possui alguns dataframes que vem automaticamente quando o software é instalado. Estes dataframes são geralmente usados como exemplos nos tutoriais e arquivos de ajuda. Uma dessas bases é o mtcars.

Para carregarmos esta base de dados basta digitar:

data("mtcars")

Após digitar o comando acima em seu console, você terá criado uma variável na memória chamada mtcars contendo os dados em questão. Como exemplo, vamos usar o comando head() para visualizar as colunas deste dataframe e as 6 primeiras linhas:

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Visualizando apenas as 6 primeiras linhas do dataframe mtcars podemos perceber que este é a estrutura de dados que se assemelha às planilhas eletrônicas como Excel. Assim, podemos entender o dataframe como sequência de observações (linhas) de determinadas variáveis (colunas). Assim como as matrizes, os dataframes também possuem dimensão, e também podemos verificar a dimensão através do comando dim().

No script abaixo, seguem outros comandos úteis para serem usados com os dataframes:

# retorna o nome das colunas do dataframe
names(mtcars)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
# retorna um resumo estatístico das colunas do dataframe
summary(mtcars)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000
#retorna as 6 últimas linhas do dataframe
tail(mtcars)
##                 mpg cyl  disp  hp drat    wt qsec vs am gear carb
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.7  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
## Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
## Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
## Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

No script acima aproveitamos para apresentar a sinalização de comentário. Toda linha no R iniciada com o # não é interpretada pelo console. Assim, o símbolo # é usado para incluirmos comentários em nosso código. Veja que no script, cada linha iniciada pelo sinal # explica o comando seguinte.

Podemos acessar qualquer registro dentro do dataframe utilizando a mesma notação de matrizes:

mtcars[1,]
##           mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
mtcars[1,2]
## [1] 6
mtcars[,3]
##  [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8
## [13] 275.8 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1 318.0 304.0 350.0
## [25] 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0
mtcars[1:3,]
##                mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
mtcars[,1:4]
##                      mpg cyl  disp  hp
## Mazda RX4           21.0   6 160.0 110
## Mazda RX4 Wag       21.0   6 160.0 110
## Datsun 710          22.8   4 108.0  93
## Hornet 4 Drive      21.4   6 258.0 110
## Hornet Sportabout   18.7   8 360.0 175
## Valiant             18.1   6 225.0 105
## Duster 360          14.3   8 360.0 245
## Merc 240D           24.4   4 146.7  62
## Merc 230            22.8   4 140.8  95
## Merc 280            19.2   6 167.6 123
## Merc 280C           17.8   6 167.6 123
## Merc 450SE          16.4   8 275.8 180
## Merc 450SL          17.3   8 275.8 180
## Merc 450SLC         15.2   8 275.8 180
## Cadillac Fleetwood  10.4   8 472.0 205
## Lincoln Continental 10.4   8 460.0 215
## Chrysler Imperial   14.7   8 440.0 230
## Fiat 128            32.4   4  78.7  66
## Honda Civic         30.4   4  75.7  52
## Toyota Corolla      33.9   4  71.1  65
## Toyota Corona       21.5   4 120.1  97
## Dodge Challenger    15.5   8 318.0 150
## AMC Javelin         15.2   8 304.0 150
## Camaro Z28          13.3   8 350.0 245
## Pontiac Firebird    19.2   8 400.0 175
## Fiat X1-9           27.3   4  79.0  66
## Porsche 914-2       26.0   4 120.3  91
## Lotus Europa        30.4   4  95.1 113
## Ford Pantera L      15.8   8 351.0 264
## Ferrari Dino        19.7   6 145.0 175
## Maserati Bora       15.0   8 301.0 335
## Volvo 142E          21.4   4 121.0 109
mtcars[1:3,1:4]
##                mpg cyl disp  hp
## Mazda RX4     21.0   6  160 110
## Mazda RX4 Wag 21.0   6  160 110
## Datsun 710    22.8   4  108  93

Outro recurso poderoso do R são os filtros. Você pode tanto usar a notação de [] ou então a função subset(). Vamos ver alguns exemplos de filtros. No exemplo 1, imagine que queremos separar as linhas que possuem o valor 4 na variável cyl. Podemos usar a função subset() ou a notação []:

subset(mtcars, mtcars$cyl == 4)
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
mtcars[mtcars$cyl == 4,]
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Agora, imagine que queremos as variáveis mpg e hp das observações que possuem o valor 4 na variável cyl:

subset(mtcars, mtcars$cyl == 4, select = c("mpg", "hp"))
##                 mpg  hp
## Datsun 710     22.8  93
## Merc 240D      24.4  62
## Merc 230       22.8  95
## Fiat 128       32.4  66
## Honda Civic    30.4  52
## Toyota Corolla 33.9  65
## Toyota Corona  21.5  97
## Fiat X1-9      27.3  66
## Porsche 914-2  26.0  91
## Lotus Europa   30.4 113
## Volvo 142E     21.4 109
mtcars[mtcars$cyl == 4, c(1, 4)]
##                 mpg  hp
## Datsun 710     22.8  93
## Merc 240D      24.4  62
## Merc 230       22.8  95
## Fiat 128       32.4  66
## Honda Civic    30.4  52
## Toyota Corolla 33.9  65
## Toyota Corona  21.5  97
## Fiat X1-9      27.3  66
## Porsche 914-2  26.0  91
## Lotus Europa   30.4 113
## Volvo 142E     21.4 109

A última estrutura de dados que iremos ver são as listas. Listas funcionam como um varal. Num varal podemos pendurar vários tipos de coisas. Você pode pendurar roupas, quadros, cadeira, fotos e várias outras coisas que você nem imagina. No R, a lista funciona da mesma forma. Você pode incluir numa lista diferentes dados e estruturas.

a <- 1
x <- c(1,2,3)
dados <- list(1,x,mtcars)
dados
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1 2 3
## 
## [[3]]
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Para recuperar o objeto de uma lista, podemos usar a notação [[ ]].

dados[[2]]
## [1] 1 2 3

Ao longo deste capítulo, criamos na memória do nosso computador várias variáveis. Você consegue se lembrar de todas elas? Não se preocupe. Existe uma função que faz isto para você:

ls()
## [1] "a"      "dados"  "m1"     "mtcars" "x"

E se não quisermos mais a variável x? Sem problemas, podemos deletar através do comando rm():

rm(x)

Se quiser excluir todas as variáveis que você criou na memória, basta usar o comando:

rm(list = ls(all=TRUE))

Objetos atômicos

Existem cinco classes básicas ou “atômicas” no R:

  • character
  • numeric
  • integer
  • complex
  • logical

Veja alguns exemplos:

# characters

"a"
## [1] "a"
"1"
## [1] "1"
"positivo"
## [1] "positivo"
"Error: objeto x não encontrado"
## [1] "Error: objeto x não encontrado"
# numeric

1
## [1] 1
0.10
## [1] 0.1
0.95
## [1] 0.95
pi
## [1] 3.141593
# integer

1L
## [1] 1
5L
## [1] 5
10L
## [1] 10
# complex (raramente utilizado para análise de dados)

2 + 5i
## [1] 2+5i
# logical

TRUE
## [1] TRUE
FALSE
## [1] FALSE

Para saber a classe de um objetivo, você pode usar a função class().

x <- 1
class(x)
## [1] "numeric"
y <- "a"
class(y)
## [1] "character"
z <- TRUE
class(z)
## [1] "logical"

Vetores

Vetores no R são os objetos mais simples que podem guardar objetos atômicos.

vetor1 <- c(1, 2, 3, 4)
vetor2 <- c("a", "b", "c")

vetor1
## [1] 1 2 3 4
vetor2
## [1] "a" "b" "c"

Um vetor tem sempre a mesma classe dos objetos que guarda.

class(vetor1)
## [1] "numeric"
class(vetor2)
## [1] "character"

De forma bastante intuitiva, você pode fazer operações com vetores.

vetor1 - 1
## [1] 0 1 2 3

Quando você faz vetor1 - 1, o R subtrai 1 de cada um dos elementos do vetor. O mesmo acontece quando você faz qualquer operação aritmética com vetores no R.

vetor1 / 2
vetor1 * 10

Você também pode fazer operações que envolvem mais de um vetor:

vetor1 * vetor1
## [1]  1  4  9 16

Neste caso, o R irá alinhar os dois vetores e multiplicar elemento por elemento. Isso pode ficar um pouco confuso quando os dois vetores não possuem o mesmo tamanho:

vetor2 <- 1:3
vetor1 * vetor2
## [1] 1 4 9 4

O R alinhou os dois vetores e, como eles não possuíam o mesmo tamanho, foi repetindo o vetor menor até completar o vetor maior. Esse comportamento é chamado de reciclagem e é útil para fazer operações elemento por elemento (vetorizadamente), mas às vezes pode ser confuso. Com o tempo, você aprenderá a se aproveitar dele.

Misturando objetos

Vetores são homogêneos

Os elementos de um vetor são sempre da mesma classe. Ou todos são numéricos, ou são todos character, ou todos são lógicos etc. Não dá para ter um número e um character no mesmo vetor, por exemplo.

Se colocarmos duas ou mais classes diferentes dentro de um mesmo vetor, o R vai forçar que todos os elementos passem a pertencer à mesma classe. O número 1.7 viraria "1.7" se fosse colocado ao lado de um "a".

y <- c(1.7, "a")  ## character
y <- c(TRUE, 2)   ## numeric
y <- c(TRUE, "a") ## character

A ordem de precedência é:

DOMINANTE character > complex > numeric > integer > logical RECESSIVO

Forçando classes explicitamente

Você pode coagir um objeto a ser de uma classe específica com as funções as.character(), as.numeric(), as.integer() e as.logical(). É equivalente à função convert() do SQL.

x <- 0:4
class(x)
## [1] "integer"
as.numeric(x)
## [1] 0 1 2 3 4
as.logical(x)
## [1] FALSE  TRUE  TRUE  TRUE  TRUE
as.character(x)
## [1] "0" "1" "2" "3" "4"

Se o R não entender como coagir uma classe na outra, ele soltará um warning informado que colocou NA no lugar.

x <- c("a", "b", "c")
as.numeric(x)
## [1] NA NA NA

Observação

O NA tem o mesmo papel que o null do SQL. Porém, há um NULL no R também, com diferenças sutis que vamos abordar mais adiante.

Fatores

Fatores podem ser vistos como vetores de inteiros que possuem rótulos (levels).

sexo <- c("M", "H", "H", "H", "M", "M", "H")
fator <- as.factor(sexo)
fator
## [1] M H H H M M H
## Levels: H M
as.numeric(fator)
## [1] 2 1 1 1 2 2 1

Eles são úteis para representar uma variável categórica (nominal e ordinal). Na modelagem, eles serão tratados de maneira especial em funções como lm() e glm().

A função levels() retorna os rótulos do fator:

levels(fator)
## [1] "H" "M"

Quando um vetor de números está como factor, ao tentar transformá-lo em numeric, você receberá um vetor de inteiros que não tem nada a ver com os valores originais!

numeros <- factor(c("10", "55", "55", "12", "10", "-5", "-90"))
as.numeric(numeros)
## [1] 3 5 5 4 3 1 2

Para evitar isso, use as.character() antes de transformar para número.

as.numeric(as.character(numeros))
## [1]  10  55  55  12  10  -5 -90

Valores especiais

Existem valores reservados para representar dados faltantes, infinitos, e indefinições matemáticas.

  • NA (Not Available)

    significa dado faltante/indisponível. É o null do SQL ou o . do SAS. O NA tem uma classe, ou seja, podemos ter NA numeric, NA character etc.

  • NaN (Not a Number)

representa indefinições matemáticas, como 0/0 e log(-1). Um NaN é um NA, mas a recíproca não é verdadeira.

  • Inf (Infinito)

é um número muito grande ou o limite matemático, por exemplo, 1/0 e 10^310. Aceita sinal negativo -Inf.

  • NULL

    representa a ausência de informação. Conceitualmente, a diferença entre NA e NULL é sutil, mas, no R, o NA está mais alinhado com os conceitos de estatística (ou como gostaríamos que os dados faltantes se comportassem em análise de dados) e o NULL está em sintonia com comportamentos de lógica de programação.

  • Use as funções is.na(), is.nan(), is.infinite() e is.null() para testar se um objeto é um desses valores.
x <- c(NaN, Inf, 1, 2, 3, NA)
is.na(x)
## [1]  TRUE FALSE FALSE FALSE FALSE  TRUE
is.nan(x)
## [1]  TRUE FALSE FALSE FALSE FALSE FALSE

Projetos no R

Uma funcionalidade importante é a criação de projetos, permitindo dividir o trabalho em múltiplos ambientes, cada um com o seu diretório, documentos e workspace.

Para criar um projeto, clique em New Project… no Menu File. Na caixa de diálogo que aparecerá, clique em New Directory para criar o projeto em uma nova pasta ou Existing Directory para criar em uma pasta existente. Se você tiver o Git instalado, você também pode usar projetos para conectar com repositórios do Github e outras plataformas de desenvolvimento. Para isso, basta clicar em Version Control.

Você conseguirá utilizar o RStudio mesmo sem definir o espaço de trabalho. No entanto, existem alguns benefícios quando quando definimos o espaço de trabalho:

  • Toda análise (tabelas e gráficos) quando exportada é salva automaticamente na pasta vinculada ao espaço de trabalho.

  • O RStudio enxerga automaticamente os arquivos existentes dentro da pasta sem a necessidade de informar o endereço completo quando realizar uma manipulação de arquivo (ex: importar uma planilha).

  • Tem a opção de salvar o histórico (History) e as variáveis armazenadas na memória (Environment).

Importação de Dados

Vamos introduzir os principais pacotes para importar dados para o R. Mostraremos como importar dados de arquivos de texto e de planilhas do excel. Antes é importante saber o ciclo da ciência de dados:

Grande parte dos dados que utilizaremos em nossas análises estarão salvos em planilhas eletrônicas como Excel, LibreOffice e outros. Embora seja possível importar arquivos com extensão .xls e .xlsx, recomendo que seja utilizado sempre a extensão genérica .csv (comma-separeted value) ou . txt. Todo arquivo do tipo csv possui dois elementos básicos que podem influenciar na importação:

read.csv(arquivo, sep=..., dec=...)

read.table(arquivo, sep=..., dec=...)

Ambos comandos possuem os parâmetros que definem o separador de colunas e o separador decimal: sep para separador de colunas e dec para separador decimal.

rm(list=ls())
if(!is.null(dev.list())) dev.off()
## null device 
##           1
getwd()#Visualizar diretorio de trabalho
## [1] "D:/Users/Admin/Documents/GitHub/MAF105/maf105.github.io/Aulas_MAF105/Curso_R"
#setwd("E:/Documentos/GitHub/MAF105/maf105.github.io/Aulas_MAF105/Curso_R")#Modificar diretorio de trabalho
cat("\014")
#Formato .csv e .txt - Sem a necessidade de pacote
dados1 <- read.table("Dados/CompanhiaMB_clear3.csv",dec = ",")#*Lembre-se do sep = ";"
str(dados1)
## 'data.frame':    37 obs. of  1 variable:
##  $ V1: chr  "Registro;Estado_Civil;Grau;N_filhos;Salario;Id_Anos;Id_Meses;Procedencia" "1;solteiro;fundamental;NA;4,00;26;3;interior" "2;casado;fundamental;1;4,56;32;10;capital" "3;casado;fundamental;2;5,25;36;5;capital" ...
dados1 <- read.table("Dados/CompanhiaMB_clear3.csv",dec = ",",sep = ";")
str(dados1)
## 'data.frame':    37 obs. of  8 variables:
##  $ V1: chr  "Registro" "1" "2" "3" ...
##  $ V2: chr  "Estado_Civil" "solteiro" "casado" "casado" ...
##  $ V3: chr  "Grau" "fundamental" "fundamental" "fundamental" ...
##  $ V4: chr  "N_filhos" NA "1" "2" ...
##  $ V5: chr  "Salario" "4,00" "4,56" "5,25" ...
##  $ V6: chr  "Id_Anos" "26" "32" "36" ...
##  $ V7: chr  "Id_Meses" "3" "10" "5" ...
##  $ V8: chr  "Procedencia" "interior" "capital" "capital" ...
dados1 <- read.table("Dados/CompanhiaMB_clear3.csv",dec = ",",sep = ";",header = TRUE)
str(dados1)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
dados2 <- read.table("Dados/CompanhiaMB_clear.txt",dec = ",",sep = ";",encoding="UTF-8")
str(dados2)
## 'data.frame':    37 obs. of  1 variable:
##  $ V1: chr  "Registro  Estado_Civil\t  Grau\t        N_filhos Salario\tId_Anos\tId_Meses\tProcedencia" "1\t  solteiro\t  fundamental\tNA       4,00   \t26\t3       \tinterior" "2\t  casado\t  fundamental\t1\t 4,56   \t32\t10\t        capital" "3\t  casado\t  fundamental\t2\t 5,25   \t36\t5\t        capital" ...
dados2 <- read.table("Dados/CompanhiaMB_clear.txt", encoding="UTF-8", sep="")
str(dados2)
## 'data.frame':    37 obs. of  8 variables:
##  $ V1: chr  "Registro" "1" "2" "3" ...
##  $ V2: chr  "Estado_Civil" "solteiro" "casado" "casado" ...
##  $ V3: chr  "Grau" "fundamental" "fundamental" "fundamental" ...
##  $ V4: chr  "N_filhos" NA "1" "2" ...
##  $ V5: chr  "Salario" "4,00" "4,56" "5,25" ...
##  $ V6: chr  "Id_Anos" "26" "32" "36" ...
##  $ V7: chr  "Id_Meses" "3" "10" "5" ...
##  $ V8: chr  "Procedencia" "interior" "capital" "capital" ...
dados2 <- read.table("Dados/CompanhiaMB_clear.txt", encoding="UTF-8", sep="",header = TRUE,dec = ",")
str(dados2)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
names(dados2) <- c("Registro","Estado_Civil","Grau","N_filhos","Salario","Id_Anos","Id_Meses","Procedencia")
head(dados2)
##   Registro Estado_Civil        Grau N_filhos Salario Id_Anos Id_Meses
## 1        1     solteiro fundamental       NA    4.00      26        3
## 2        2       casado fundamental        1    4.56      32       10
## 3        3       casado fundamental        2    5.25      36        5
## 4        4     solteiro       medio       NA    5.73      20       10
## 5        5     solteiro fundamental       NA    6.26      40        7
## 6        6       casado fundamental        0    6.66      28        0
##   Procedencia
## 1    interior
## 2     capital
## 3     capital
## 4       outra
## 5       outra
## 6    interior

Outras Funções

#Formato .csv e .txt - Sem a necessidade de pacote
dados1 <- read.csv("Dados/CompanhiaMB_clear3.csv",dec = ",")#*Lembre-se do sep = ";"
str(dados1)
## 'data.frame':    36 obs. of  1 variable:
##  $ Registro.Estado_Civil.Grau.N_filhos.Salario.Id_Anos.Id_Meses.Procedencia: chr  "00;26;3;interior" "56;32;10;capital" "25;36;5;capital" "73;20;10;outra" ...
dados1 <- read.csv("Dados/CompanhiaMB_clear3.csv",dec = ",",sep = ";")
str(dados1)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
dados2 <- read.csv("Dados/CompanhiaMB_clear.txt",dec = ",",sep = ";",encoding="UTF-8")
str(dados2)
## 'data.frame':    36 obs. of  1 variable:
##  $ Registro..Estado_Civil...Grau.........N_filhos.Salario.Id_Anos.Id_Meses.Procedencia: chr  "1\t  solteiro\t  fundamental\tNA       4,00   \t26\t3       \tinterior" "2\t  casado\t  fundamental\t1\t 4,56   \t32\t10\t        capital" "3\t  casado\t  fundamental\t2\t 5,25   \t36\t5\t        capital" "4\t  solteiro\t  medio\t        NA\t 5,73   \t20\t10\t        outra" ...
dados2 <- read.csv2("Dados/CompanhiaMB_clear.txt", encoding="UTF-8", sep="")
str(dados2)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
names(dados2) <- c("Registro","Estado_Civil","Grau","N_filhos","Salario","Id_Anos","Id_Meses","Procedencia")
#Pacote para a leitura de .xlsx e .xls
library(readxl)
dados3<- read_excel("Dados/CompanhiaMB_clear.xlsx")
str(dados3)
## tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : chr [1:36] "NA" "1" "2" "NA" ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
dados4 <- read_excel("Dados/CompanhiaMB_clear2.xls",col_types = c("numeric", "text", "text","text", "numeric", "numeric", "numeric","text"))
str(dados4)
## tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : chr [1:36] "NA" "1" "2" "NA" ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
#Pacote para a leitura de .txt e .csv
library(readr)
dados5 <- read_delim("Dados/CompanhiaMB_clear3.csv",";", escape_double = FALSE, trim_ws = TRUE)
str(dados5)
## spc_tbl_ [36 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : num [1:36] NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num [1:36] 400 456 525 573 626 666 686 739 759 744 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Registro = col_double(),
##   ..   Estado_Civil = col_character(),
##   ..   Grau = col_character(),
##   ..   N_filhos = col_double(),
##   ..   Salario = col_number(),
##   ..   Id_Anos = col_double(),
##   ..   Id_Meses = col_double(),
##   ..   Procedencia = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>
dados6 <- read_delim("Dados/CompanhiaMB_clear3.csv",";", escape_double = FALSE, trim_ws = TRUE,locale = locale(decimal_mark = ","))
str(dados6)
## spc_tbl_ [36 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : num [1:36] NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Registro = col_double(),
##   ..   Estado_Civil = col_character(),
##   ..   Grau = col_character(),
##   ..   N_filhos = col_double(),
##   ..   Salario = col_double(),
##   ..   Id_Anos = col_double(),
##   ..   Id_Meses = col_double(),
##   ..   Procedencia = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>

Antes de iniciar as análises com os dados importados, sempre desconfie!

Inspecione o objeto que recebeu os dados importados para garantir que não houve problemas com o separador decimal, nem com o separador de colunas, nem com os nomes das colunas. Diversos comandos podem ser usados para investigar os dados. Veja alguns exemplos:

dim(dados1)
## [1] 36  8
dim(dados2)
## [1] 36  8
dim(dados3)
## [1] 36  8
dim(dados4)
## [1] 36  8
dim(dados5)
## [1] 36  8
dim(dados6)
## [1] 36  8
str(dados1)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
str(dados2)
## 'data.frame':    36 obs. of  8 variables:
##  $ Registro    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr  "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr  "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : int  NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num  4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : int  26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : int  3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr  "interior" "capital" "capital" "outra" ...
str(dados3)
## tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : chr [1:36] "NA" "1" "2" "NA" ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
str(dados4)
## tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : chr [1:36] "NA" "1" "2" "NA" ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
str(dados5)
## spc_tbl_ [36 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : num [1:36] NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num [1:36] 400 456 525 573 626 666 686 739 759 744 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Registro = col_double(),
##   ..   Estado_Civil = col_character(),
##   ..   Grau = col_character(),
##   ..   N_filhos = col_double(),
##   ..   Salario = col_number(),
##   ..   Id_Anos = col_double(),
##   ..   Id_Meses = col_double(),
##   ..   Procedencia = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(dados6)
## spc_tbl_ [36 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Registro    : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Estado_Civil: chr [1:36] "solteiro" "casado" "casado" "solteiro" ...
##  $ Grau        : chr [1:36] "fundamental" "fundamental" "fundamental" "medio" ...
##  $ N_filhos    : num [1:36] NA 1 2 NA NA 0 NA NA 1 NA ...
##  $ Salario     : num [1:36] 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
##  $ Id_Anos     : num [1:36] 26 32 36 20 40 28 41 43 34 23 ...
##  $ Id_Meses    : num [1:36] 3 10 5 10 7 0 0 4 10 6 ...
##  $ Procedencia : chr [1:36] "interior" "capital" "capital" "outra" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Registro = col_double(),
##   ..   Estado_Civil = col_character(),
##   ..   Grau = col_character(),
##   ..   N_filhos = col_double(),
##   ..   Salario = col_double(),
##   ..   Id_Anos = col_double(),
##   ..   Id_Meses = col_double(),
##   ..   Procedencia = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>
head(dados1)
##   Registro Estado_Civil        Grau N_filhos Salario Id_Anos Id_Meses
## 1        1     solteiro fundamental       NA    4.00      26        3
## 2        2       casado fundamental        1    4.56      32       10
## 3        3       casado fundamental        2    5.25      36        5
## 4        4     solteiro       medio       NA    5.73      20       10
## 5        5     solteiro fundamental       NA    6.26      40        7
## 6        6       casado fundamental        0    6.66      28        0
##   Procedencia
## 1    interior
## 2     capital
## 3     capital
## 4       outra
## 5       outra
## 6    interior
head(dados2)
##   Registro Estado_Civil        Grau N_filhos Salario Id_Anos Id_Meses
## 1        1     solteiro fundamental       NA    4.00      26        3
## 2        2       casado fundamental        1    4.56      32       10
## 3        3       casado fundamental        2    5.25      36        5
## 4        4     solteiro       medio       NA    5.73      20       10
## 5        5     solteiro fundamental       NA    6.26      40        7
## 6        6       casado fundamental        0    6.66      28        0
##   Procedencia
## 1    interior
## 2     capital
## 3     capital
## 4       outra
## 5       outra
## 6    interior
head(dados3)
## # A tibble: 6 × 8
##   Registro Estado_Civil Grau       N_filhos Salario Id_Anos Id_Meses Procedencia
##      <dbl> <chr>        <chr>      <chr>      <dbl>   <dbl>    <dbl> <chr>      
## 1        1 solteiro     fundament… NA          4         26        3 interior   
## 2        2 casado       fundament… 1           4.56      32       10 capital    
## 3        3 casado       fundament… 2           5.25      36        5 capital    
## 4        4 solteiro     medio      NA          5.73      20       10 outra      
## 5        5 solteiro     fundament… NA          6.26      40        7 outra      
## 6        6 casado       fundament… 0           6.66      28        0 interior
head(dados4)
## # A tibble: 6 × 8
##   Registro Estado_Civil Grau       N_filhos Salario Id_Anos Id_Meses Procedencia
##      <dbl> <chr>        <chr>      <chr>      <dbl>   <dbl>    <dbl> <chr>      
## 1        1 solteiro     fundament… NA          4         26        3 interior   
## 2        2 casado       fundament… 1           4.56      32       10 capital    
## 3        3 casado       fundament… 2           5.25      36        5 capital    
## 4        4 solteiro     medio      NA          5.73      20       10 outra      
## 5        5 solteiro     fundament… NA          6.26      40        7 outra      
## 6        6 casado       fundament… 0           6.66      28        0 interior
head(dados5)
## # A tibble: 6 × 8
##   Registro Estado_Civil Grau       N_filhos Salario Id_Anos Id_Meses Procedencia
##      <dbl> <chr>        <chr>         <dbl>   <dbl>   <dbl>    <dbl> <chr>      
## 1        1 solteiro     fundament…       NA     400      26        3 interior   
## 2        2 casado       fundament…        1     456      32       10 capital    
## 3        3 casado       fundament…        2     525      36        5 capital    
## 4        4 solteiro     medio            NA     573      20       10 outra      
## 5        5 solteiro     fundament…       NA     626      40        7 outra      
## 6        6 casado       fundament…        0     666      28        0 interior
head(dados6)
## # A tibble: 6 × 8
##   Registro Estado_Civil Grau       N_filhos Salario Id_Anos Id_Meses Procedencia
##      <dbl> <chr>        <chr>         <dbl>   <dbl>   <dbl>    <dbl> <chr>      
## 1        1 solteiro     fundament…       NA    4         26        3 interior   
## 2        2 casado       fundament…        1    4.56      32       10 capital    
## 3        3 casado       fundament…        2    5.25      36        5 capital    
## 4        4 solteiro     medio            NA    5.73      20       10 outra      
## 5        5 solteiro     fundament…       NA    6.26      40        7 outra      
## 6        6 casado       fundament…        0    6.66      28        0 interior
tail(dados6)
## # A tibble: 6 × 8
##   Registro Estado_Civil Grau     N_filhos Salario Id_Anos Id_Meses Procedencia
##      <dbl> <chr>        <chr>       <dbl>   <dbl>   <dbl>    <dbl> <chr>      
## 1       31 solteiro     superior       NA    16.2      31        5 outra      
## 2       32 casado       medio           1    16.6      36        4 interior   
## 3       33 casado       superior        3    17.3      43        7 capital    
## 4       34 solteiro     superior       NA    18.8      33        7 capital    
## 5       35 casado       medio           2    19.4      48       11 capital    
## 6       36 casado       superior        3    23.3      42        2 interior
summary(dados1)
##     Registro     Estado_Civil           Grau              N_filhos   
##  Min.   : 1.00   Length:36          Length:36          Min.   :0.00  
##  1st Qu.: 9.75   Class :character   Class :character   1st Qu.:1.00  
##  Median :18.50   Mode  :character   Mode  :character   Median :2.00  
##  Mean   :18.50                                         Mean   :1.65  
##  3rd Qu.:27.25                                         3rd Qu.:2.00  
##  Max.   :36.00                                         Max.   :5.00  
##                                                        NA's   :16    
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 4.000   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 7.553   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :10.165   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :11.122   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:14.060   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :23.300   Max.   :48.00   Max.   :11.000                     
## 
summary(dados2)
##     Registro     Estado_Civil           Grau              N_filhos   
##  Min.   : 1.00   Length:36          Length:36          Min.   :0.00  
##  1st Qu.: 9.75   Class :character   Class :character   1st Qu.:1.00  
##  Median :18.50   Mode  :character   Mode  :character   Median :2.00  
##  Mean   :18.50                                         Mean   :1.65  
##  3rd Qu.:27.25                                         3rd Qu.:2.00  
##  Max.   :36.00                                         Max.   :5.00  
##                                                        NA's   :16    
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 4.000   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 7.553   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :10.165   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :11.122   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:14.060   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :23.300   Max.   :48.00   Max.   :11.000                     
## 
summary(dados3)
##     Registro     Estado_Civil           Grau             N_filhos        
##  Min.   : 1.00   Length:36          Length:36          Length:36         
##  1st Qu.: 9.75   Class :character   Class :character   Class :character  
##  Median :18.50   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :18.50                                                           
##  3rd Qu.:27.25                                                           
##  Max.   :36.00                                                           
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 4.000   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 7.553   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :10.165   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :11.122   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:14.060   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :23.300   Max.   :48.00   Max.   :11.000
summary(dados4)
##     Registro     Estado_Civil           Grau             N_filhos        
##  Min.   : 1.00   Length:36          Length:36          Length:36         
##  1st Qu.: 9.75   Class :character   Class :character   Class :character  
##  Median :18.50   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :18.50                                                           
##  3rd Qu.:27.25                                                           
##  Max.   :36.00                                                           
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 4.000   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 7.553   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :10.165   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :11.122   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:14.060   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :23.300   Max.   :48.00   Max.   :11.000
summary(dados5)
##     Registro     Estado_Civil           Grau              N_filhos   
##  Min.   : 1.00   Length:36          Length:36          Min.   :0.00  
##  1st Qu.: 9.75   Class :character   Class :character   1st Qu.:1.00  
##  Median :18.50   Mode  :character   Mode  :character   Median :2.00  
##  Mean   :18.50                                         Mean   :1.65  
##  3rd Qu.:27.25                                         3rd Qu.:2.00  
##  Max.   :36.00                                         Max.   :5.00  
##                                                        NA's   :16    
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 400.0   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 755.2   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :1016.5   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :1112.2   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:1406.0   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :2330.0   Max.   :48.00   Max.   :11.000                     
## 
summary(dados6)
##     Registro     Estado_Civil           Grau              N_filhos   
##  Min.   : 1.00   Length:36          Length:36          Min.   :0.00  
##  1st Qu.: 9.75   Class :character   Class :character   1st Qu.:1.00  
##  Median :18.50   Mode  :character   Mode  :character   Median :2.00  
##  Mean   :18.50                                         Mean   :1.65  
##  3rd Qu.:27.25                                         3rd Qu.:2.00  
##  Max.   :36.00                                         Max.   :5.00  
##                                                        NA's   :16    
##     Salario          Id_Anos         Id_Meses      Procedencia       
##  Min.   : 4.000   Min.   :20.00   Min.   : 0.000   Length:36         
##  1st Qu.: 7.553   1st Qu.:30.00   1st Qu.: 3.750   Class :character  
##  Median :10.165   Median :34.50   Median : 6.000   Mode  :character  
##  Mean   :11.122   Mean   :34.58   Mean   : 5.611                     
##  3rd Qu.:14.060   3rd Qu.:40.00   3rd Qu.: 8.000                     
##  Max.   :23.300   Max.   :48.00   Max.   :11.000                     
## 

Help me!

No R, há quatro principais entidades para se pedir ajuda:

A busca por ajuda é feita preferencialmente, mas não necessariamente, na ordem acima.

Você também pode pedir ajuda a um colega!!!

              –

Documentação do R

A documentação do R serve para você aprender a usar uma determinada função.

?mean
help(mean)

Cinco dicas:

  1. Os exemplos no final são particularmente úteis.
  2. Leia a seção Usage para ter noção de como usar.
  3. Os parâmetros estão descritos em Arguments. Identifique quais tipos de objetos eles recebem.
  4. Caso essa função não atenda às suas necessidades, a seção See Also sugere funções relacionadas.
  5. Alguns pacotes possuem tutorias de uso mais completos. Esses textos são chamados de vignettes e podem ser acessados com a função vignette(package = 'nomeDoPacote'). Por exemplo, vignette(package = 'dplyr'). Depois de ver a lista de artigos, escolha um nome e rode vignette(topic = 'nome', package = 'nomeDoPacote'). Por exemplo, vignette(topic = 'introduction', package = 'dplyr').

Resumo de Dados

Distribuições de Frequência

tab2_1 <- read.table("Dados/CompanhiaMB_clear3.csv",dec = ",",sep = ";",header = TRUE)
ni<-table(tab2_1$Grau) # Calcula a tabela de frequências absolutas e armazena o resultado em 'mytab'
fi<-prop.table(ni) # Tabela de frequências relativas (f_i)
p_fi<-100*prop.table(ni) # Porcentagem (100 f_i)

# Adiciona linhas de total
ni<-c(ni,sum(ni)) 
fi<-c(fi,sum(fi))
p_fi<-c(p_fi,sum(p_fi))
names(ni)[4]<-"Total"

Para ter o resultado na mesma disposição que na Tabela 2.2, podemos fazer da seguinte forma:

tab2_2<-cbind(ni,fi=round(fi,digits=2),p_fi=round(p_fi,digits=2))
tab2_2
##             ni   fi   p_fi
## fundamental 12 0.33  33.33
## medio       18 0.50  50.00
## superior     6 0.17  16.67
## Total       36 1.00 100.00
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_3<-as.data.frame(
        t(rbind(
            ni=c(650,1020,330,2000),
            p_fi=c(32.5,51,16.5,1)
        ))
        ,row.names =c("Fundamental","Médio","Superior","Total")
        )
tab2_3
##               ni p_fi
## Fundamental  650 32.5
## Médio       1020 51.0
## Superior     330 16.5
## Total       2000  1.0
ni<-table(cut(tab2_1$Salario, breaks = seq(4,24,by=4),right=FALSE)) # Frequencias por categorias
tab2_4 <- rbind(ni, p_fi = 100*prop.table(ni)) # Frequencias relativas em %
#quebras de linha apenas ilustrativas para facilitar a leitura
tab2_4 <- as.data.frame(
          t(cbind(
                  tab2_4,
                  c(sum(tab2_4[1,]),sum(tab2_4[2,])
          ))),row.names =c(colnames(tab2_4),"Total")) #Construcao da tabela
tab2_4<-transform(tab2_4,p_fi=round(p_fi,digits=2))
tab2_4
##         ni   p_fi
## [4,8)   10  27.78
## [8,12)  12  33.33
## [12,16)  8  22.22
## [16,20)  5  13.89
## [20,24)  1   2.78
## Total   36 100.00

Ramos e Folhas

print("Figura 2.9: Ramo-e-folhas para a Variável S: salários.")
## [1] "Figura 2.9: Ramo-e-folhas para a Variável S: salários."
stem(tab2_1$Salario,scale=2)
## 
##   The decimal point is at the |
## 
##    4 | 06
##    5 | 37
##    6 | 379
##    7 | 446
##    8 | 157
##    9 | 01488
##   10 | 58
##   11 | 16
##   12 | 08
##   13 | 269
##   14 | 77
##   15 | 
##   16 | 026
##   17 | 3
##   18 | 8
##   19 | 4
##   20 | 
##   21 | 
##   22 | 
##   23 | 3
#quebras de linha apenas ilustrativas para facilitar a leitura
dureza<-c(53  ,70.2,84.3,69.5,77.8,87.5,53.4,82.5,67.3,54.1,
          70.5,71.4,95.4,51.1,74.4,55.7,63.5,85.8,53.5,64.3,
          82.7,78.5,55.7,69.1,72.3,59.5,55.3,73  ,52.4,50.7
          )
print("Figura 2.10: Ramo-e-folhas para dados de dureza de peças de alumínio.")
## [1] "Figura 2.10: Ramo-e-folhas para dados de dureza de peças de alumínio."
stem(as.integer(dureza),scale=.5)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   5 | 01233345559
##   6 | 34799
##   7 | 00123478
##   8 | 22457
##   9 | 5
print("Figura 2.11: Ramo-e-folhas para dados de dureza, com ramos divididos.")
## [1] "Figura 2.11: Ramo-e-folhas para dados de dureza, com ramos divididos."
stem(as.integer(dureza),scale=1)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   5 | 0123334
##   5 | 5559
##   6 | 34
##   6 | 799
##   7 | 001234
##   7 | 78
##   8 | 224
##   8 | 57
##   9 | 
##   9 | 5

Representação Gráfica

Gráfico de barras

#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
  table(tab2_1$Grau),
  ylab="Frequência",
  cex.names=0.7,
  names.arg = c("Fundamental","Médio", "Superior"),
  col="darkgrey",
  border=NA,
  main="Figura 2.2: Gráfico em barras para a variável Y: grau de instrução.",
  axes=TRUE,
  ylim=c(0,20)
  )

#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
  table(tab2_1$N_filhos),
  ylab="Frequência",
  cex.names=0.7,
  col="darkgrey",
  main="Figura 2.4: Gráfico em barras para a variável Z: Numero de filhos.",
  border=NA)

#quebras de linha apenas ilustrativas para facilitar a leitura
barplot(
  table(cut(tab2_1$Salario, breaks = seq(4,24,by=4),right=FALSE)),
  ylab="Frequência",
  xaxt="n",
  cex.names=0.7,
  col="darkgrey",
  border=NA,
  main="Figura 2.6: Gráfico em barras para a variável S: salários")
axis(1,at=c(.75,1.9,3.1,4.3,5.5),labels=seq(6,22,4),tick=F)

Gráfico de setores (pizza)

labs<-paste(1:3,"(",tab2_2[1:3,1],";",round(tab2_2[1:3,3],1),"%)",sep="")
pie(table(tab2_1$Grau),labels=labs)
#title("Figura 2.3: Gráfico em setores para a variável Y: grau de instrução")
legend(-1.1,-0.8,legend=c("1=Fundamental, 2=Médio, 3=Superior"),border=NA,box.col=NA)

Histograma

fig27<-hist(tab2_1$Salario, breaks = seq(4,24,by=4),right=FALSE,probability = T,plot=F)
aux<-with(fig27, 100 * density* diff(breaks)[1])
labs <- paste(round(aux), "%", sep="")
#quebras de linha apenas ilustrativas para facilitar a leitura
plot(fig27, 
     freq = FALSE, labels = labs, 
     ylab="Densidade de Frequência",
     xlab="Salário",
     col="darkgrey",
     border="white",
     #labels=T,
     main="Figura 2.7: Histograma da variável S: salários",
     xlim=c(0,24), xaxp=c(0,24,6),
     ylim=c(0,.1))

fig28<-hist(tab2_1$N_filhos, right=F, breaks=seq(-.5,5.5,1),plot=F)
aux<-with(fig28, 100 * density* diff(breaks)[1])
labs <- paste(round(aux), "%", sep="")
#quebras de linha apenas ilustrativas para facilitar a leitura
plot(fig28,
  ylab="Densidade de Frequência",
  xlab="Número de Filhos",
  col="darkgrey",
  border="white",
  bty="n",yaxt="n",ylim=c(0,8),
  main="Figura 2.8: Histograma da variável Z: número de filhos",
  labels=labs)

Referências e recomendações

curso-r: Descomplicando a ciência de dados. Site e blog com muito material. Os integrantes são extremamente pró-ativos.

RPubs. Comandos R para análises estatísticas de exercicíos e teoria do livro Estatística Básica(Bussab e Morettin, 2013)

Oliveira, P. F., Guerra, S., McDonnell, R. Ciência de dados com R: Introdução – Brasília: Editora IBPAD, 2018. (Livro muito bom e gratuito)